#ifndef THREAD_H_
#define THREAD_H_

#include<pthread.h>
#include<unistd.h>
#include<cassert>

class Thread
{
	private:
		pthread_t idThread;
		bool corriendo;
		// Método estático (función plana) que realmente ejecuta el thread
		// (tomará el puntero this como argumento siempre).
		static void* static_run(void* arg);
		// Constructor de copia y operator= ocultos (para prevenir descuidos)
		Thread(const Thread&);
		Thread& operator=(const Thread&);
		
	protected:
		// Método virtual puro que deben implementar las subclases
		virtual void main() = 0;

	public:
		// Constructor
		Thread(){corriendo=false;}
		// Lanza el thread
		virtual void run();
		// Pide al thread que finalice sus tareas lo antes posible
		virtual void stop() = 0;
		// Indica si el thread está corriendo o no
		virtual bool running() const;
		// Espera a que el thread termine realmente
		virtual void join();
		// Destructor
		virtual ~Thread();
		// Duerme el thread actual una cierta cantidad de milisegundos
		static void sleep(unsigned long msecs);
};

#endif /*THREAD_H_*/

